package cn.id68.www.http;

import java.io.IOException;
import java.util.concurrent.TimeUnit;

import cn.id68.www.http.callback.Callback;
import cn.id68.www.http.request.OkHttpRequest;
import okhttp3.Call;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

/**
 * Created by Administrator on 2017/3/20.
 */
public class RequestCall {

    private OkHttpRequest okHttpRequest;
    private Request request;
    private Call call;

    private long readTimeOut;
    private long writeTimeOut;
    private long connTimeOut;

    private OkHttpClient clone;

    public OkHttpRequest getOkHttpRequest() {
        return okHttpRequest;
    }

    public Request getRequest() {
        return request;
    }

    public Call getCall() {
        return call;
    }

    public RequestCall(OkHttpRequest okHttpRequest){
        this.okHttpRequest = okHttpRequest;
    }

    public RequestCall readTimeOut(long readTimeOut){
        this.readTimeOut = readTimeOut;
        return this;
    }

    public RequestCall writeTimeOut(long writeTimeOut){
        this.writeTimeOut = writeTimeOut;
        return this;
    }

    public RequestCall connTimeOut(long connTimeOut){
        this.connTimeOut = connTimeOut;
        return this;
    }

    public Call buildCall(Callback callback){
        request = generateRequest(callback);

        if (readTimeOut > 0 || writeTimeOut > 0 || connTimeOut > 0){
            readTimeOut  = readTimeOut > 0 ? readTimeOut:OkHttpUtils.DEFAULT_MILLISECONDS;
            writeTimeOut = writeTimeOut > 0 ? writeTimeOut:OkHttpUtils.DEFAULT_MILLISECONDS;
            connTimeOut = connTimeOut > 0 ? connTimeOut:OkHttpUtils.DEFAULT_MILLISECONDS;

            clone = OkHttpUtils.getmInstance().getmOkHttpClient().newBuilder()
                    .writeTimeout(writeTimeOut, TimeUnit.MILLISECONDS)
                    .readTimeout(readTimeOut,TimeUnit.MILLISECONDS)
                    .connectTimeout(connTimeOut,TimeUnit.MILLISECONDS)
                    .build();
            call = clone.newCall(request);
        }else {
            call = OkHttpUtils.getmInstance().getmOkHttpClient().newCall(request);
        }

        return call;
    }

    private Request generateRequest(Callback callback) {
        return okHttpRequest.generateRequest(callback);
    }

    public void execute(Callback callback){
        buildCall(callback);
        if (callback != null){
            callback.onBefore(request,okHttpRequest.getId());
        }
        OkHttpUtils.getmInstance().execute(this,callback);
    }

    public Response execute() throws IOException{
        buildCall(null);
        return call.execute();
    }

    public void cancel(){
        if (call!=null){
            call.cancel();
        }
    }
}
